using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Messaging;
using Torneo.Phone.Mensajes;
using System.Collections.ObjectModel;
using Torneo.Phone.ServicioTorneo;
using Microsoft.Practices.ServiceLocation;
using Torneo.Phone.Model;

namespace Torneo.Phone.ViewModel
{

    public class MainViewModel : ViewModelBase
    {
        public const string ResultadosPropertyName = "Resultados";
        private ObservableCollection<ResultadoWP> _Resultados = null;
        public const string JugadoresPropertyName = "Jugadores";
        private ObservableCollection<Jugador> _Jugadores = null;
        public const string EmparejamientosPropertyName = "Emparejamientos";
        private ObservableCollection<EmparejamientoWP> _Emparejamientos = null;
       
        public ObservableCollection<Jugador> Jugadores
        {
            get
            {
                return this._Jugadores;
            }

            set
            {
                if (this._Jugadores == value)
                {
                    return;
                }

                this._Jugadores = value;
                this.RaisePropertyChanged(JugadoresPropertyName);
            }
        }

        public ObservableCollection<ResultadoWP> Resultados
        {
            get
            {
                return this._Resultados;
            }

            set
            {
                if (this._Resultados == value)
                {
                    return;
                }

                this._Resultados = value;
                this.RaisePropertyChanged(ResultadosPropertyName);
            }
        }

        public ObservableCollection<EmparejamientoWP> Emparejamientos
        {
            get
            {
                return this._Emparejamientos;
            }

            set
            {
                if (this._Emparejamientos == value)
                {
                    return;
                }

                this._Emparejamientos = value;
                this.RaisePropertyChanged(EmparejamientosPropertyName);
            }
        }

        public MainViewModel()
        {
            if (IsInDesignMode)
            {
                // Code runs in Blend --> create design time data.
            }
            else
            {
                // Code runs "for real"
            }

            this.Inicializar();
        }

        public void Inicializar()
        {
            this.SuscribiraMensajesEmparejamientos();
            this.SuscribiraMensajesJugadores();
            this.SuscribiraMensajesResultados();
            ServiceLocator.Current.GetInstance<IDataService>().CargarEmparejamientos();
            ServiceLocator.Current.GetInstance<IDataService>().CargarResultados();
            ServiceLocator.Current.GetInstance<IDataService>().CargarJugadores();
        }

        private void SuscribiraMensajesResultados()
        {
            Messenger.Default.Register<MensajeResultados>(this, mensaje => this.OnMensajeResultados(mensaje));
        }

        private void SuscribiraMensajesJugadores()
        {
            Messenger.Default.Register<MensajeJugador>(this, mensaje => this.OnMensajeJugadors(mensaje));
        }

        private void SuscribiraMensajesEmparejamientos()
        {
            Messenger.Default.Register<MensajeEmparejamientos>(this, mensaje => this.OnMensajeEmparejamientos(mensaje));
        }

        private void OnMensajeResultados(MensajeResultados mensaje)
        {
            this.Resultados = mensaje.Resultados;
        }

        private void OnMensajeJugadors(MensajeJugador mensaje)
        {
            this.Jugadores = mensaje.Jugadores;
        }

        private void OnMensajeEmparejamientos(MensajeEmparejamientos mensaje)
        {
            this.Emparejamientos = mensaje.Emparejamientos;
        }
    }
}